package com.ai.aichat.service;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.time.Duration;
import java.time.Instant;
import java.util.Collection;
import java.util.Date;
import java.util.stream.Collectors;

@Service
public class JwtService {
    // 使用足够长度的密钥（HS256 至少 256 bit）；生产建议从环境变量/配置中心读取
    private static final String SECRET = "D3H2cX8rT5kLm9Q1vZ7aY4uP0sNbG6wF2eJ5xR8iT0qU7lC3mA9dS6hB1pK4oV2";
    private final Key key = Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8));

    // 生成 Token：subject=用户名，附加 roles 声明，设置签发与过期时间
    public String generateToken(String username, Collection<? extends GrantedAuthority> authorities) {
        String roles = authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(","));
        return Jwts.builder()
                .setSubject(username)                  // 设置主体（当前用户）
                .claim("roles", roles)                 // 存放角色/权限（逗号分隔）
                .setIssuedAt(new Date())               // 签发时间
                .setExpiration(Date.from(Instant.now().plus(Duration.ofHours(4)))) // 过期时间（示例 4 小时）
                .signWith(key, SignatureAlgorithm.HS256) // 使用对称密钥 HS256 签名
                .compact();
    }

    // 解析并验证 Token：包含签名与过期校验，失败会抛出 JwtException
    public Jws<Claims> parse(String token) {
        return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
    }
}
